from functools import wraps  # 导入用于装饰器的工具函数
from flask import request, abort, Flask, jsonify  # 导入Flask相关的模块
import logging

# 定义一个限制客户端IP地址的装饰器
def limit_remote_addr(f):
    @wraps(f)  # 使用wraps保持原始函数的元数据（如名称、文档字符串等）
    def decorated_function(*args, **kwargs):
        allowed_prefixes = ['10.13.68.', '192.168.', '127.0.0.'] # 允许访问的IP地址前缀
        client_ip = request.remote_addr  # 获取请求的客户端IP地址

        # 如果客户端IP地址不符合允许的前缀，则返回403 Forbidden错误
        if not any(client_ip.startswith(prefix) for prefix in allowed_prefixes):
            logging.warning(f"Forbidden access from IP: {client_ip}")
            abort(403)  # 中止请求并返回HTTP 403状态码

        # 如果IP地址验证通过，则调用原始视图函数并传递所有参数
        return f(*args, **kwargs)

    return decorated_function  # 返回包装后的函数


app = Flask(__name__)  # 创建一个新的Flask应用实例


# 定义路由 `/index`，允许GET和POST请求，并应用 `limit_remote_addr` 装饰器
@app.route('/index', methods=['GET', 'POST'])
@limit_remote_addr
def index():
    source = request.args.get('source')  # 从查询字符串中获取 `source` 参数
    data = request.args.get('data')  # 从查询字符串中获取 `data` 参数

    # 返回格式化的字符串作为响应内容
    return "source={}, data={}".format(source, data)


# 定义路由 `/home`，允许GET和POST请求，并应用 `limit_remote_addr` 装饰器
@app.route('/home', methods=['GET', 'POST'])
@limit_remote_addr
def home():
    print(request.json.get('k1'))  # 打印JSON数据中的键 `k1` 对应的值到服务器控制台
    print(list(request.json.keys()))  # 打印JSON数据的所有键到服务器控制台

    # 将接收到的JSON数据转换为JSON格式的响应返回给客户端
    return jsonify(request.json)


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=True)  # 启动Flask应用，监听所有网络接口，端口5000，启用调试模式